package com.guowangwei.experiment_2;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ApplicationEventMulticaster;
import org.springframework.context.event.SimpleApplicationEventMulticaster;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.core.env.Environment;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Component;

@EnableConfigurationProperties( CustomProperties.class )
public class Lab2AutoConfig {
    @Bean
    @ConditionalOnProperty( prefix = "sai.auto" , name="enable" , havingValue = "true" )
    CommandLineRunner createCustomCommandLineRunner(Environment environment ) {
        return new CustomCommandLineRunner( environment ) ;
    }

    @Bean( AbstractApplicationContext.APPLICATION_EVENT_MULTICASTER_BEAN_NAME )
    ApplicationEventMulticaster customApplicationEvenMulticaster(ThreadPoolTaskExecutor taskExecutor ) {
        SimpleApplicationEventMulticaster eventMulticaster = new SimpleApplicationEventMulticaster( ) ;
        eventMulticaster.setTaskExecutor( taskExecutor ) ;
        return eventMulticaster ;
    }

    static class NoticeEven extends ApplicationEvent {
        private static final Logger logger = LoggerFactory.getLogger( NoticeEven.class ) ;
        private final String message ;
        public NoticeEven( String message ) {
            super( message ) ;
            this.message = message ;
            logger.info( "添加事件成功！message:{}" , message ) ;
        }
        public String getMessage() { return message ; }
    }

    @Component
    static class NoticeListener implements ApplicationListener< NoticeEven > {
        private static final Logger logger = LoggerFactory.getLogger( NoticeListener.class ) ;
        @Override
        public void onApplicationEvent(NoticeEven event) {
            logger.info( "事件监听器获取到 NoticeEvent，睡眠当前线程2秒。。。" ) ;
            try{
                Thread.sleep( 2000 ) ;
            }catch ( InterruptedException exception ) {
                exception.printStackTrace( ) ;
            }
            logger.info( "NoticeEvent 的message属性是：{}" , event.getMessage( ) ) ;
        }
    }
}
